// g++ -g p12.cpp -o p12 && ./p12
// gdb p12


#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 2e5+9;

int n,q;
int t[N*4], lz[N*4], a[N];

//update ls and rs according to lz[o]
void update(int s,int e, int o, int x){
    t[o] += (e-s+1) * x;
    lz[o] += x;
}

void pushup(int o){
    t[o] = t[o*2] + t[o*2+1];
}

void pushdown(int s, int e, int o){
    if ( lz[o]==0 ) return;
    
    int mid = (s+e) / 2;
    update(s,mid,o*2,lz[o]);
    update(mid+1,e,o*2+1,lz[o]);

    lz[o] = 0;
}

void build( int s=1, int e=n, int o=1){
    if ( s==e ){
        return t[o] = a[s], void();
    }

    int mid = (s+e) / 2;
    build(s,mid,o*2); build(mid+1,e,o*2+1);
    pushup(o);
}

void add(int l, int r, int x, int s=1, int e=n, int o=1){
    if ( l<=s && e<=r ) {
        update(s,e,o,x);
        return;
    }

    pushdown(s,e,o);
    int mid = (s+e) / 2;
    if ( l<=mid ) add(l,r,x,s,mid,o*2);
    if ( mid+1<=r ) add(l,r,x,mid+1,e,o*2+1);
    pushup(o);
}

int query(int l, int r, int s=1, int e=n, int o=1){
    if ( l<=s && e<=r ) return t[o];

    pushdown(s,e,o);
    int mid = (s+e) / 2;
    int res = 0;
    if ( l<=mid ) res += query(l,r,s,mid,o*2);
    if ( mid+1<=r ) res += query(l,r,mid+1,e,o*2+1); 
    pushup(o);
    return res;
}


signed main(){
    // ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

    cin >> n >> q;
    // cout << "n=" << n << ", q=" << q << '\n'; 
    for ( int i=1; i<=n; i++ ) cin >> a[i];
    build();

    while(q--){
        int op; cin >> op;
        if ( op==1 ){
            int l,r,x; cin >> l >> r >> x;
            add(l,r,x);
        } else {
            int l,r; cin >> l >> r;
            cout << query(l,r) << '\n';
        }
    }

    return 0;
}